/*
 * ThBuscar.java
 * Copyright (c) 2006, FMap
 *
 * Created on 23 de noviembre de 2005, 22:58
 */

package fmap.actions.mapF.NewMapF;

import fmap.DatosCompartidos;
import fmap.dao.MapFDao;
import fmap.dao.TableDao;
import fmap.model.MapF;
import fmap.model.Node;
import java.io.*;
import java.util.HashMap;

/**
 * Esta es la clase que da de alta un mapa de ficheros.
 * Toda la complejidad de se centra en la creación dinámica de las tablas en las que se almacenan los nodos en base al nº de nodos almacenados en una tabla.
 * Por lo demás solo tiene un metodo recursivo que va almacenando todo el arbol de ficheros en BD con todos los datos de cada uno de los nodos
 *
 * @author  Javier Sanroman Araujo
 * @version $Revision: 1.1
 */
public class NewMapFTh implements Runnable
{
    /** Referencia al receptor unico */
    private NewMapFEvt miReceptor;
    private String ruta;
    private String titMapF;
    private String icon;
    private String desc;
    private int idCat; // No se esta utilizando
    private int idColeccion;
    private MapF mapF = null;
    private int numNodos = 0;
    private int numNodosActual = 0;
    private int idTableActual;
    private HashMap numNodeMaxIdTable = new HashMap ();


    public NewMapFTh ( String _ruta, String _titMapF, int _idCat, int _idColeccion, String _icon, String _desc )
    {
        ruta            =   _ruta;
        titMapF         =   _titMapF;
        idCat           =   _idCat;
        idColeccion     =   _idColeccion;
        icon            =   _icon;
        desc            =   _desc;
    }
    
    
    
    /**
     * Guardamos un arbol de directorios en un fichero xml
     */
    public void run ()
    {

        DatosCompartidos.getJFrameNewMapF ().getProgress ().setIndeterminate ( true );
        DatosCompartidos.getJFrameNewMapF ().setTextLogNewMapF ( "Preparando mapa ficheros ...", false);
        

        // Calculamos la tabla sobre la que vamos a guardar los nodos de este mapa de ficheros
        int idTable             = new TableDao ().selectIdTableNewMapF ();
        numNodeMaxIdTable.put ( idTable, new Integer (new TableDao ().selectNumNode ( idTable )));
        idTableActual = idTable;
        

        // Guardamos el mapa de ficheros
        mapF = new MapF ( -1, idColeccion, titMapF, ruta, desc, icon, -1, idTable, idCat);

        mapF = new MapFDao ().insertMapF ( mapF );

        new TableDao().insertTableMapF ( idTableActual, mapF.getIdMapF ());
        // -----------------------------------------------------------------------------------------------
        
        // Comenzamos a recorrer los nodos para almacenarlos en la BD
        
        File f = new File (ruta);
        File[] aF = f.listFiles ();
        
//        long tamano_directorio=0;
        
        DatosCompartidos.getJFrameNewMapF ().setTextLogNewMapF ( "Guardando ...", false);
        
        for( int i=0; i<aF.length; i++ )
        {
            numNodos++;
            numNodosActual++;
            Node node = null;
            java.sql.Date date = new java.sql.Date ( aF[i].lastModified () );
            
            if( aF[i].isDirectory () )
            {
                miReceptor.actualizaFormAltaMapF ( aF[i].getPath ()+""+aF[i].getName (), -1 );
                
                node = new Node ( mapF.getIdMapF (), -1, idColeccion, aF[i].getName (), "", 0, "", 0, date, idTable, -1, idTableActual );
                node.setId ( numNodos );
                
                // Insertamos el nodo en la BD
                node = new fmap.dao.NodeDao ().insertNode ( node, idTable );
                
                getInsertSubDir (aF[i].getAbsolutePath (), node, idTableActual);
            }
            else
            {
                miReceptor.actualizaFormAltaMapF ( aF[i].getPath ()+""+aF[i].getName (), -1 );
                
                node = new Node ( mapF.getIdMapF (), -1, idColeccion, aF[i].getName (), "", aF[i].length (), "", 1, date, idTable, -1, idTableActual );
                node.setId ( numNodos );
                
                // Insertamos el nodo en la BD
                node = new fmap.dao.NodeDao ().insertNode ( node, idTable );
            }
        }
        
        
        // Actualizamos el mapa de ficheros con el numero de nodos
        mapF.setNunNod ( numNodos );
        mapF = new fmap.dao.MapFDao ().updateMapF ( mapF );
        
        // Actualizamos la tabla en la que se almacenaron los nodos con el nuevo nº de nodos
        new TableDao ().updateTableSumNode ( mapF.getIdTable (), mapF.getNumNod () );
        
        DatosCompartidos.getJFrameNewMapF ().getProgress ().setIndeterminate ( false );
        
        DatosCompartidos.getJFrameNewMapF ().setTextLogNewMapF ( "Mapa de ficheros guardado con éxito" , false );
        
        miReceptor.finAltaMapF ();
    }
    
    
    private int getInsertSubDir (String ruta, Node _node, int idTable)
    {
        File f = new File (ruta);
        
        File[] aF = f.listFiles ();
        
//        long tamano_directorio=0;
        
        if( aF != null )
        {
            try
            {
                // Comprobamos que en la tabla actual todavia podemos hacer mas insercciones y sino creamos otra
                if( (Integer)numNodeMaxIdTable.get (idTableActual) + numNodosActual > 30000 )
                {
                    // Actualizamos la tabla en la que se almacenaron los nodos con el nuevo nº de nodos
                    new TableDao ().updateTableSumNode ( idTableActual, numNodosActual );
                    
                    idTableActual = new TableDao ().insertTable ();
                    new fmap.dao.CreateDb ().createTableNode ( idTableActual );

                    new TableDao().insertTableMapF (idTableActual, mapF.getIdMapF ());

                    numNodeMaxIdTable.put ( idTableActual, new TableDao ().selectNumNode ( idTableActual ));
                    numNodosActual = 0;
                }
                
                
                for( int i=0; i<aF.length; i++ )
                {
                    numNodos++;
                    numNodosActual++;
                    java.sql.Date date = new java.sql.Date ( aF[i].lastModified () );
                    
                    Node node = null;
                    
                    if( aF[i].isDirectory () )
                    {
                        miReceptor.actualizaFormAltaMapF ( aF[i].getPath ()+""+aF[i].getName (),-1);
                        
                        node = new Node ( mapF.getIdMapF (), _node.getIdNode (), idColeccion, aF[i].getName (), "", 0, aF[i].getPath (), 0, date, idTable, _node.getIdTable (), idTableActual );
                        node.setId ( numNodos );
                        // Insertamos el nodo en la BD
                        node = new fmap.dao.NodeDao ().insertNode ( node, idTable );
                        
                        // Insertamos recursivamente todos sus subdirectorios
                        getInsertSubDir (aF[i].getAbsolutePath (), node, idTableActual);
                    }
                    else
                    {
                        miReceptor.actualizaFormAltaMapF ( aF[i].getPath ()+""+aF[i].getName (),-1);
                        
                        node = new Node ( mapF.getIdMapF (), _node.getIdNode (), idColeccion, aF[i].getName (), "", aF[i].length (), aF[i].getPath (), 1, date, idTable, _node.getIdTable (), idTableActual );
                        node.setId ( numNodos );
                        // Insertamos el nodo en la BD
                        node = new fmap.dao.NodeDao ().insertNode ( node, idTable );
                        
                    }
                    
                }
            }
            catch( Exception e )
            {
                DatosCompartidos.getJFrameNewMapF ().setTextLogNewMapF ( "ERROR: No se ha podido completar el proceso de alta", false);
                DatosCompartidos.getJFrameNewMapF ().getProgress ().setIndeterminate ( false );
            }
        }
        return numNodos;
    }
    
    
    
    
    /** Añade un componente listener a esta clase */
    public void addMiEventoListener ( NewMapFEvt receptor )
    {
        // No se permite que intente incorporar mas de un receptor
        if( miReceptor == null )
        {
            miReceptor = receptor;
        }
        else
        {
            System.out.println ( "No se soportan multiples Receptores" );
            // Se sale, si se intentan registrar varios objetos Receptor
            System.exit ( 0 );
        }
    }
}